package com.paypalpay.util.wx;

import com.paypalpay.util.wx.entity.WX_News;
import com.paypalpay.util.wx.entity.WX_NewsMessage;
import com.paypalpay.util.wx.entity.WX_TextMessage;
import com.thoughtworks.xstream.XStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

public class MessageUtil {
    public static final String MSG_TEXT = "text"; // 文本消息
    public static final String MSG_IMAGE = "image";// 图片消息
    public static final String MSG_NEWS = "news";// 图片消息
    public static final String MSG_VOICE = "voice"; // 语音消息
    public static final String MSG_VIDEO = "video"; // 视频消息
    public static final String MSG_SHORT_VIDEO = "shortvideo"; // 小视频消息
    public static final String MSG_LOCATION = "location"; // 地理位置消息
    public static final String MSG_LINK = "link"; // 链接消息

    // 事件推送
    public static final String MSG_EVENT = "event";// 事件推送
    public static final String MSG_EVENT_SUBSCIBE = "subscribe";// 订阅
    public static final String MSG_EVENT_UNSUBSCIBE = "unsubscribe";// 取消订阅
    public static final String MSG_EVENT_SCAN = "SCAN"; // 扫码事件（用户已经关注并进入公众号）

    // 菜单事件推送
    public static final String MSG_EVENT_CLICK = "click"; // 单击
    public static final String MSG_EVENT_VIEW = "view"; // 链接跳转
    public static final String MSG_EVENT_SCANCODE_PUSH = "scancode_push"; // 扫码推送
    public static final String MSG_EVENT_SCANCODE_WAITMSG = "scancode_waitmsg"; // 扫码等待
    public static final String MSG_EVENT_PIC_SYSPHOTO = "pic_sysphoto";
    public static final String MSG_EVENT_PIC_PHOTO_OR_ALBUM = "pic_photo_or_album";
    public static final String MSG_EVENT_PIC_WEIXIN = "pic_weixin";
    public static final String MSG_EVENT_LOCATION_SELECT = "location_select"; // 位置选择
    public static final String MSG_EVENT_MEDIA_ID = "media_id";
    public static final String MSG_EVENT_VIEW_LIMITED = "view_limited";

    /**
     * 从request中读取xml，并将其转成map集合
     *
     * @param request
     * @return
     * @throws IOException
     * @throws DocumentException
     */
    public static Map<String, String> xmlToMap(HttpServletRequest request)
            throws IOException, DocumentException {
        Map<String, String> map = new HashMap<String, String>();

        SAXReader reader = new SAXReader();
        InputStream ins = request.getInputStream();
        Document doc = reader.read(ins);

        Element root = doc.getRootElement();

        List<Element> list = root.elements();

        for (Element el : list) {
            map.put(el.getName(), el.getText());
        }
        ins.close();
        return map;
    }

    /**
     * 将对象转换成xml
     *
     * @param textMessage
     * @return
     */
    public static String textMessageToXml(WX_TextMessage textMessage) {
        XStream xStream = new XStream();
        xStream.alias("xml", textMessage.getClass());// 根节点为<xml>
        return xStream.toXML(textMessage);
    }

    /**
     * 图文消息转换XML
     *
     * @param newsMessage
     * @return
     */
    public static String newsMessageToXml(WX_NewsMessage newsMessage) {
        XStream xStream = new XStream();
        xStream.alias("xml", newsMessage.getClass());// 根节点为<xml>
        xStream.alias("item", new WX_News().getClass());// <item>节点5
        return xStream.toXML(newsMessage);
    }

    /**
     * 初始化文本消息
     *
     * @param fromUserName
     * @param toUserName
     * @param content
     * @return
     */
    public static String initTextMessage(String fromUserName,
                                         String toUserName, String content) {
        WX_TextMessage text = new WX_TextMessage();
        text.setToUserName(fromUserName);
        text.setFromUserName(toUserName);
        text.setMsgType(MessageUtil.MSG_TEXT);
        text.setCreateTime(String.valueOf(System.currentTimeMillis()));
        //你发送的消息是：
        text.setContent(content);
        return MessageUtil.textMessageToXml(text);
    }
    //关注事件推送一张图片,
    public static String initSubscibeMessage(String fromUserName, String toUserName){
        String message = null;

        List<WX_News> newsList = new ArrayList<WX_News>();
        WX_NewsMessage newsMessage = new WX_NewsMessage();

        WX_News news = new WX_News();
        news.setTitle("使用前必读");
        news.setDescription("使用前必读");
        news.setPicUrl("https://mmbiz.qpic.cn/mmbiz_jpg/0W7a6ZdrBrlzcWlKia0aeREQR3sVtVicBIEt7cw69DQ9ibMIA2M9RqxZDoeIvIBr3Amwa1UeGic3x3nOVkcZmp0v9A/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1");
        news.setUrl("https://mp.weixin.qq.com/s/wfZD7vArd3TO8xjeitiyWA");

        newsList.add(news);

        newsMessage.setToUserName(fromUserName);
        newsMessage.setFromUserName(toUserName);
        newsMessage.setCreateTime(String.valueOf(System.currentTimeMillis()));
        newsMessage.setMsgType(MessageUtil.MSG_NEWS);
        newsMessage.setArticles(newsList);
        newsMessage.setArticleCount(String.valueOf(newsList.size()));

        message = newsMessageToXml(newsMessage);

        return message;
    }
    /***
     * 图文消息，可以多处使用
     * @param fromUserName
     * @param toUserName
     * @return
     */
    public static String initNewsMessage(String fromUserName, String toUserName) {
        String message = null;

        List<WX_News> newsList = new ArrayList<WX_News>();
        WX_NewsMessage newsMessage = new WX_NewsMessage();

        WX_News news = new WX_News();
        news.setTitle("课程介绍");
        news.setDescription("***************************************************");
        news.setPicUrl("http://jihe.free.ngrok.cc/weixin/image/sunset.jpg");
        news.setUrl("http://www.sina.com.cn");

        newsList.add(news);

        newsMessage.setToUserName(fromUserName);
        newsMessage.setFromUserName(toUserName);
        newsMessage.setCreateTime(String.valueOf(System.currentTimeMillis()));
        newsMessage.setMsgType(MessageUtil.MSG_NEWS);
        newsMessage.setArticles(newsList);
        newsMessage.setArticleCount(String.valueOf(newsList.size()));

        message = newsMessageToXml(newsMessage);

        return message;
    }

    /**
     * 主菜单
     *
     * @return
     */
    public static String menuText() {
        StringBuffer sb = new StringBuffer();
        // sb.append("欢迎您的关注，请按照菜单提示进行操作：\n\n");
        // sb.append("1、课程介绍\n\n");
        // sb.append("2、产品介绍 \n\n");
        // sb.append("3、图文消息 \n\n");
        // sb.append("回复?调出主菜单。");

        sb.append("感谢您关注【荔枝全球电话卡】！\n"
                + "请您在使用本卡前认真阅读以下内容：\n"
                + "1. 您在境内无法使用本SIM卡，只限在境外使用。\n"
                + "2. 若您的手机只有一个卡槽则要把本卡作为主卡使用才能上网，再将手机作为WIFI热点以使得周边设备也能通过该热点上网。\n"
                + "3. 若您的手机支持多卡，那么推荐您将本卡则作为卡1使用，并设置“移动数据”由卡1负责，卡2则是放置您最常用的那张境内手机号卡或存储卡。\n"
                + "4. 请您点击【设置卡】菜单来获得如何设置。强烈建议您将设置卡的方法图片保存到手机里，以便在境外无法微信时能通过查看图片的方式来协助您设置。\n"
                + "5. 您达到境外后，随时插卡，即时生效。例如：您购买了3天流量包，您在当地时间2018年5月1日13点0分插卡后开机激活，则流量包开始生效计费，流量包会在当地时间2018年的5月4日13点0分到期失效。");
        return sb.toString();

    }

    /**
     * 课程介绍内容回复
     *
     * @return
     */
    public static String keChengJieShao() {
        StringBuffer sb = new StringBuffer();
        //sb.append("1、课程介绍\n\n");
        sb.append("感谢您关注【荔枝全球电话卡】！\n"
                + "请您在使用本卡前认真阅读以下内容：\n"
                + "1. 您在境内无法使用本SIM卡，只限在境外使用。\n"
                + "2. 若您的手机只有一个卡槽则要把本卡作为主卡使用才能上网，再将手机作为WIFI热点以使得周边设备也能通过该热点上网。\n"
                + "3. 若您的手机支持多卡，那么推荐您将本卡则作为卡1使用，并设置“移动数据”由卡1负责，卡2则是放置您最常用的那张境内手机号卡或存储卡。\n"
                + "4. 请您点击【设置卡】菜单来获得如何设置。强烈建议您将设置卡的方法图片保存到手机里，以便在境外无法微信时能通过查看图片的方式来协助您设置。\n"
                + "5. 您达到境外后，随时插卡，即时生效。例如：您购买了3天流量包，您在当地时间2018年5月1日13点0分插卡后开机激活，则流量包开始生效计费，流量包会在当地时间2018年的5月4日13点0分到期失效。");
        return sb.toString();
    }

    /**
     * 产品介绍回复
     *
     * @return
     */
    public static String chanPinJieShao() {
        StringBuffer sb = new StringBuffer();
        sb.append("感谢您关注【荔枝全球电话卡】！\n"
                + "请您在使用本卡前认真阅读以下内容：\n"
                + "1. 您在境内无法使用本SIM卡，只限在境外使用。\n"
                + "2. 若您的手机只有一个卡槽则要把本卡作为主卡使用才能上网，再将手机作为WIFI热点以使得周边设备也能通过该热点上网。\n"
                + "3. 若您的手机支持多卡，那么推荐您将本卡则作为卡1使用，并设置“移动数据”由卡1负责，卡2则是放置您最常用的那张境内手机号卡或存储卡。\n"
                + "4. 请您点击【设置卡】菜单来获得如何设置。强烈建议您将设置卡的方法图片保存到手机里，以便在境外无法微信时能通过查看图片的方式来协助您设置。\n"
                + "5. 您达到境外后，随时插卡，即时生效。例如：您购买了3天流量包，您在当地时间2018年5月1日13点0分插卡后开机激活，则流量包开始生效计费，流量包会在当地时间2018年的5月4日13点0分到期失效。");
        return sb.toString();
    }

    /***
     * 一直没信号点击事件设置
     */
    public static String clickHuifu(){
        StringBuffer sb = new StringBuffer();
        sb.append("请您按以下顺序排除故障：\n"
                +"1. 请确认【荔枝卡】已插入手机的第一卡槽（卡1）；\n"
                +"2. 若插入正确，那请您确认插入的【荔枝卡】的设置过程是否正确，您可以通过本公众号的【设置卡】菜单进入相关地区的设置指导；\n"
                +"3. 若设置正确，那请您重启手机，需要等待1-5分钟；\n"
                +"4. 若重启后仍无法解决，那请您确认手机是否支持本卡（点本公众号【设置卡】菜单中的【查看可用机型】）；\n"
                +"5. 若您确认手机型号支持本卡，那请您确认是否成功地购买了当地流量套餐；\n"
                +"6. 若您确认已成功买了流量套餐，那请您确认当前位置是否在信号较弱区域（机场跑道和停机坪、高速公路、海岛等信号较弱地区）；\n"
                +"7. 若您确认周边信号也无问题，那烦请您联系我们的客服，她会耐心帮您解决问题。\n");
        return  sb.toString();

    }

    public static String yinniText() {
        // TODO Auto-generated method stub
        StringBuffer sb = new StringBuffer();
        sb.append("https://mp.weixin.qq.com/s/cibrzkzSsTfrMqvWFEu14A");
        return  sb.toString();
    }

    public static String mianshuiText(){
        StringBuffer sb = new StringBuffer();
        sb.append("https://mp.weixin.qq.com/s/sUrzo1NoGLikEl7YWobo4Q");
        return  sb.toString();
    }
}

